package it.unisa.udocs.gestioneAutenticazione;

import it.unisa.udocs.data.Account;
import it.unisa.udocs.data.Amministratore;
import it.unisa.udocs.data.ResponsabileAteneo;
import it.unisa.udocs.data.Ricercatore;
import it.unisa.udocs.facade.FacadeAutenticazione;
import it.unisa.udocs.facade.IFacadeAutenticazione;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Login Servlet implementation
 */

public class LoginServlet extends HttpServlet {
	
	// per evitare il warning
	private static final long serialVersionUID = 1L;
	
	public static ServletContext servletContext;
	
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config){

		try {
			super.init(config);			
			servletContext = getServletConfig().getServletContext();
		} 
		
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("connected");
	this.login(request,response);
		
	}
	
	/** Oggetto che si occupa di effettuare le operazioni sul DB Account*/
	private static IFacadeAutenticazione facAccount;

	public LoginServlet() {
		facAccount = new FacadeAutenticazione();
	}
	
	
	public void login(HttpServletRequest request, HttpServletResponse response) {

		// inizializzazione
		RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");


		try {
			String username = request.getParameter("usr");
			String password = request.getParameter("psw");

			//  PER EVITARE DI DIGITARE I CAMPI --
			//if(username.equals("")&&password.equals("")){ username="paolodisp"; password="p1234"; }
			// -----------------------------------

			if(!controllaCredenziali(username,password)){

				rd = request.getRequestDispatcher("/index.jsp");
				request.setAttribute("error","");
				System.out.println("Username/password errati");

			}

			else{

				// accesso al db
				Account account = facAccount.cercaAccount(username,password); 
				
//
				if(account instanceof Ricercatore) {
					
					Ricercatore ricercatore = (Ricercatore) account;
					// inserimento di un oggetto in sessione
					request.getSession().setAttribute("ricercatore",ricercatore);
					
					rd = request.getRequestDispatcher("/home.jsp");
					
				}
				
				else if(account instanceof Amministratore) {
					
					Amministratore amministratore = (Amministratore) account;
					// inserimento di un oggetto in sessione
					request.getSession().setAttribute("amministratore",amministratore);
					
					rd = request.getRequestDispatcher("/homeAmministratore.jsp");
				}
				else if(account instanceof ResponsabileAteneo) {
					
					ResponsabileAteneo responsabile = (ResponsabileAteneo) account;
					// inserimento di un oggetto in sessione
					request.getSession().setAttribute("responsabile",responsabile);
					
					rd = request.getRequestDispatcher("/homeResponsabile.jsp");
				}
				else {
					request.setAttribute("error","funzionalita' in manutenzione");
					}
				}

			rd.forward(request, response);	

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Controlla i parametri passati per verificare che rispettino quanto specificato nella documentazione
	 * @param username username
	 * @param password passowrd
	 * @return true se i parametri rispettano le condizioni, false altrimenti
	 */
	private static boolean controllaCredenziali(String username,String password){
		if(username.length()< 6 || username.length() > 20 
				|| password.length() < 6 || password.length() > 15
				|| controllaCaratteriSpeciali(username))
			return false;

		return true;
	}
	
	/**
	 * Controlla se nell'username sono presenti dei caratteri speciali
	 * @param username
	 * @return true se i caratteri sono presenti, false altrimenti
	 */
	private static boolean controllaCaratteriSpeciali(String username) {
		boolean presenti=false;
		
		for (int i=0; i<username.length(); i++) {
			char currentChar = username.charAt(i);
			if (! (Character.isLetter(currentChar) || Character.isDigit(currentChar))) {
				presenti=true;
			}
			
		}
		return presenti;
	
	}

}